home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / bb / src / textdsp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-30  |  10.7 KB  |  477 lines

  1. /*
  2.  
  3.         text display for 16 color graphic mode
  4.  
  5.                       1993.6.27 v1.0
  6.                       copyright Y.Ouchi
  7.  
  8.             input    *log    : log data
  9.                     logleng    : log length
  10.                     **title : title data
  11.                     *intext : log analize result
  12.                     *textno : display text no
  13.  
  14.             output    0  : all end
  15.                     1  : log save & quit
  16.                     2  : title mode switch
  17.                     3  : new file read
  18.                     4  : mode change
  19.  
  20. */
  21.  
  22. #include    <stdio.h>
  23. #include    <string.h>
  24. #include    <stdlib.h>
  25. #include    <jctype.h>
  26. #include    <time.h>
  27. #include    "egb.h"
  28. #include    "mos.h"
  29. #include    "snd.h"
  30. #include    "bb.h"
  31.  
  32.     /* 関数プロトタイプ宣言 */
  33. int        nextchek( );
  34.  
  35. extern    char    egbwork[];
  36. extern    char    moswork[];
  37. extern    void    linedsp(int, int, char *);
  38. extern    void    linedspv(int, int, char *, int, unsigned int, unsigned int);
  39. extern    void    box(int, int, int, int, int, int);
  40. extern    int        menuread(void);
  41. extern    int        mouse_in(int *, int *);
  42. extern    int        key_in(void);
  43. extern    int        pad_in(void);
  44. extern    int        crfindb(int, char *, int *, int *);
  45.  
  46. extern    int        max_text;
  47. extern    int        dispmode;
  48.  
  49. int textdsp(char *log,int logleng,char **title,
  50.                 struct logcontent *intext,short *disptext,int *textno)
  51. {
  52.     char    *nontitle={"no title"};
  53.     int        i,j,k,line,startp,leng,textleng,next_pos;
  54.     int        dispstartline,dispendline;
  55.     int        overlapline=1;
  56.     char    dsptext[500][81];
  57.     int        endcode=0;
  58.     int        contflag=1,textdispflag;
  59.     int        dispmakeflag;
  60.     int        back=0;
  61.     int        nowtext;
  62.     unsigned    char    *text;
  63.     char    footer[90]={"      lines       bytes"};
  64.     int        titleno;
  65.  
  66.     titleno=-2;
  67.  
  68.     while ( contflag ){
  69.  
  70.                     /* first display text search            */
  71.         for (i=*textno;i<max_text;i++){
  72.             if(intext->text[disptext[i]].text.id!=TITLE_ID) break;
  73.         }
  74.         *textno=i;
  75.         nowtext=disptext[i];
  76.  
  77.                     /* title display on header            */
  78.         if (titleno!=intext->text[nowtext].text.title_index){
  79.             EGB_writePage(egbwork,1);
  80.             box(0,16,639,34,TITLEBACK_COL,1);
  81.             EGB_color(egbwork, 0, TITLE_COL);
  82.             if (intext->text[nowtext].text.id == NOTITLE_TEXT_ID){
  83.                 linedspv(0,32,nontitle,1,TITLE_COL,TITLEBACK_COL);
  84.             }
  85.             else{
  86.                 if (intext->text[nowtext].text.title_index>=0){
  87.                     linedspv(0,32,
  88.                             title[intext->text[nowtext].text.title_index],
  89.                             1,TITLE_COL,TITLEBACK_COL);
  90.                 }
  91.                 else {
  92.                     linedspv(0,32,nontitle,1,TITLE_COL,TITLEBACK_COL);
  93.                 }
  94.             }
  95.             EGB_color(egbwork, 0, TEXT_COL);
  96.             EGB_writePage(egbwork,0);
  97.             titleno=intext->text[nowtext].text.title_index;
  98.         }
  99.  
  100.                     /* text display */
  101.                         /* display data meke */
  102.         text=(unsigned char *)&log[(int)intext->text[nowtext].text.pos];
  103.         textleng=intext->text[nowtext].text.leng;
  104.         startp=leng=line=0;
  105.  
  106.         dispmakeflag=1;
  107.         while(dispmakeflag){
  108.             i=crfindb(textleng-startp,(char *)&text[startp],&leng,&next_pos);
  109.             if (i>0){
  110.                 if (leng>80){
  111.                     do {
  112.                         k=0;
  113.                         while(k<80){
  114.                             if (iskanji(text[startp+k])) k=k+2;
  115.                             else k=k+1;
  116.                         }
  117.                         if (k==81) k=79;
  118.                         for(j=0;j<k;j++) dsptext[line][j]=text[startp+j];
  119.                         dsptext[line][j]=0x00;
  120.                         leng=leng-k;
  121.                         startp=startp+k;
  122.                         next_pos=next_pos-k;
  123.                         line=line+1;
  124.                         if (line>500) break;
  125.                     } while(leng>80);
  126.                 }
  127.                 if (line>500) break;
  128.                 for(j=0;j<leng;j++) dsptext[line][j]=text[startp+j];
  129.                 dsptext[line][j]=0x00;
  130.                 line=line+1;
  131.                 if (line>500) break;
  132.                 if (leng==80){
  133.                     dsptext[line][0]=0x00;
  134.                     line=line+1;
  135.                     if (line>500) break;
  136.                 }
  137.                 for(j=1;j<i;j++){
  138.                     dsptext[line][0]=0x00;
  139.                     line=line+1;
  140.                     if (line>500) break;
  141.                 }
  142.                 if (next_pos<=0) dispmakeflag=0;
  143.                 else startp=startp+next_pos;
  144.             }
  145.             else{
  146.                 if (leng>0){
  147.                     for (j=0;j<leng;j++) dsptext[line][j]=text[startp+j];
  148.                     dsptext[line][j]=0x00;
  149.                     line=line+1;
  150.                 }
  151.                 dispmakeflag=0;
  152.             }
  153.         }
  154.         for(i=line-1;i>0;i--) if (dsptext[i][0]!=0x00) break;
  155.         line=i+1;
  156.  
  157.                         /* footer write (line no & size) */
  158.         j=line;
  159.         for(i=4;i>0;i--){
  160.             if (j>0){
  161.                 footer[i]=j%10+0x30;
  162.                 j=j/10;
  163.             }
  164.             else footer[i]=0x20;
  165.         }
  166.         j=(int)intext->text[nowtext].text.leng;
  167.         for(i=16;i>11;i--){
  168.             if (j>0){
  169.                 footer[i]=j%10+0x30;
  170.                 j=j/10;
  171.             }
  172.             else footer[i]=0x20;
  173.         }
  174.         EGB_writePage(egbwork,1);
  175.         EGB_color(egbwork, 0, TITLE_COL);
  176.         linedsp(0,477,footer);
  177.         EGB_writePage(egbwork,0);
  178.         EGB_color(egbwork, 0, TEXT_COL);
  179.  
  180.                         /* text display */
  181.         dispstartline=0;
  182.         if (back==1){
  183.             while (dispstartline+TEXT_LINE_NO<line){
  184.                 dispstartline=dispstartline+TEXT_LINE_NO-overlapline;
  185.             }
  186.         }
  187.         textdispflag=1;
  188.         while ( textdispflag ){
  189.             EGB_clearScreen(egbwork);
  190.             dispendline = dispstartline + TEXT_LINE_NO ;
  191.             if (dispendline > line) dispendline=line;
  192.             for (i=0;i<dispendline-dispstartline;i++){
  193.                 linedspv(0,i*17+51,dsptext[dispstartline+i],
  194.                                                 0,TEXT_COL,BACK_COL);
  195.             }
  196.             switch ( nextchek() ){
  197.                 case 0 :    /* all end */
  198.                     endcode=0;
  199.                     textdispflag = 0 ;
  200.                     contflag=0;
  201.                     break ;
  202.                 case 1 :    /* next page */
  203.                     if (dispstartline+TEXT_LINE_NO >= line) {
  204.                         for (i=*textno+1;i<max_text;i++){
  205.                             if (intext->text[disptext[i]].text.id!=TITLE_ID)
  206.                                             break;
  207.                         }
  208.                         if (i < max_text){
  209.                             *textno=i;
  210.                             back=0;
  211.                         }
  212.                         else back=1;
  213.                         textdispflag = 0 ;
  214.                     }
  215.                     else dispstartline=dispstartline+TEXT_LINE_NO-overlapline;
  216.                     break ;
  217.                 case 2 :    /* previous page */
  218.                     if (dispstartline-TEXT_LINE_NO+overlapline < 0){
  219.                         for (i=*textno-1;i>=0;i--){
  220.                             if (intext->text[disptext[i]].text.id!=TITLE_ID)
  221.                                         break;
  222.                         }
  223.                         if (i>=0){
  224.                             *textno=i;
  225.                             back=1;
  226.                         }
  227.                         else back=0;
  228.                         textdispflag = 0 ;
  229.                     }
  230.                     else dispstartline=dispstartline-TEXT_LINE_NO+overlapline;
  231.                     break ;
  232.                 case 3 :    /* next text */
  233.                     for (i=*textno+1;i<max_text;i++){
  234.                         if (intext->text[disptext[i]].text.id!=TITLE_ID) break;
  235.                     }
  236.                     if (i < max_text){
  237.                         *textno=i;
  238.                         back=0;
  239.                     }
  240.                     textdispflag = 0 ;
  241.                     break ;
  242.                 case 4 :    /* previous text */
  243.                     for (i=*textno-1;i>=0;i--){
  244.                         if (intext->text[disptext[i]].text.id!=TITLE_ID) break;
  245.                     }
  246.                     if (i>=0){
  247.                         *textno=i;
  248.                     }
  249.                     back=0;
  250.                     textdispflag = 0 ;
  251.                     break ;
  252.                 case 5 :    /* next title */
  253.                     for (i=*textno+1;i<max_text-1;i++){
  254.                         if (intext->text[disptext[i]].text.id==TITLE_ID) break;
  255.                     }
  256.                     for (j=i+1;j<max_text;j++){
  257.                         if (intext->text[disptext[j]].text.id!=TITLE_ID){
  258.                             *textno=j;
  259.                             break;
  260.                         }
  261.                     }
  262.                     back=0;
  263.                     textdispflag = 0 ;
  264.                     break ;
  265.                 case 6 :    /* previous title */
  266.                     for (i=*textno-2;i>=0;i--){
  267.                         if (intext->text[disptext[i]].text.id==TITLE_ID) break;
  268.                     }
  269.                     for (j=i+1;j<max_text;j++){
  270.                         if (intext->text[disptext[j]].text.id!=TITLE_ID){
  271.                             *textno=j;
  272.                             break;
  273.                         }
  274.                     }
  275.                     back=0;
  276.                     textdispflag = 0 ;
  277.                     break ;
  278.                 case 7 :    /* top text */
  279.                     *textno=0;
  280.                     back=0;
  281.                     textdispflag = 0 ;
  282.                     break ;
  283.                 case 8 :    /* last text */
  284.                     *textno=max_text-1;
  285.                     back=0;
  286.                     textdispflag = 0 ;
  287.                     break ;
  288.                 case 9 :    /* log save & quit */
  289.                     endcode = 1;
  290.                     contflag=0;
  291.                     textdispflag = 0 ;
  292.                     break ;
  293.                 case 10 :    /* title mode switch */
  294.                     endcode = 2;
  295.                     contflag=0;
  296.                     textdispflag = 0 ;
  297.                     break ;
  298.                 case 11 :    /* new file select */
  299.                     endcode = 3;
  300.                     contflag=0;
  301.                     textdispflag = 0 ;
  302.                     break ;
  303.                 case 12 :    /* mode change */
  304.                     endcode = 4;
  305.                     contflag=0;
  306.                     textdispflag = 0 ;
  307.                     break ;
  308.                 case 13 :    /* mode change */
  309.                     endcode = 5;
  310.                     contflag=0;
  311.                     textdispflag = 0 ;
  312.                     break ;
  313.                 default :
  314.                     break ;
  315.             }
  316.         }
  317.         EGB_writePage(egbwork,1);
  318.         box(0,462,190,479,TITLEBACK_COL,1);
  319.         EGB_writePage(egbwork,0);
  320.         EGB_color(egbwork, 0, TEXT_COL);
  321.  
  322.     }
  323.  
  324.     return(endcode);
  325.  
  326. }
  327.  
  328.  
  329. /*
  330.         next action check
  331.                       1993.4.10 v.00
  332.                       1993.4.17 v.01    menu made
  333.                       1993.4.24 v.02    pad add
  334.                       copyright Y.Ouchi
  335.  
  336.             input    non
  337.  
  338.             output    0  : all end
  339.                     1  : next page
  340.                     2  : previous page
  341.                     3  : next text
  342.                     4  : previous text
  343.                     5  : next title
  344.                     6  : previous title
  345.                     7  : top text
  346.                     8  : last text
  347.                     9  : log save & quit
  348.                     10  : title mode switch
  349.                     11  : new file select
  350.                     12  : mode change
  351.  
  352.                     0 & 4-12 menuread return
  353. */
  354.  
  355. int nextchek( )
  356. {
  357.     int        i,x,y;
  358.     int        endcode=0;
  359.     time_t    now;
  360.     char    nowchar[30];
  361.     char    oldmin=0x00;
  362.     int        contflag;
  363.  
  364.     contflag=1;
  365.     while ( contflag ) {
  366.  
  367.                     /* mouse status check */
  368.         switch (mouse_in(&x,&y)){
  369.             case 0 : break;        /* no input */
  370.             case 1 :            /* right bottan */
  371.                 endcode=2;
  372.                 contflag=0;
  373.                 break;
  374.             case 2 :            /* left bottan  */
  375.                 endcode=1;
  376.                 contflag=0;
  377.                 break;
  378.             case 3 :            /* both bottan  */
  379.                 endcode=menuread( );
  380.                 contflag=0;
  381.                 break;
  382.             default : break;
  383.         }
  384.  
  385.                     /* key board status check */
  386.         switch (key_in()){
  387.             case 0 : break;        /* no input */
  388.             case 1 :            /* ESC key  */
  389.                 endcode=menuread( );
  390.                 contflag=0;
  391.                 break;
  392.             case 2 :            /* down key */
  393.                 endcode=1;
  394.                 contflag=0;
  395.                 break;
  396.             case 3 :            /* up key   */
  397.                 endcode=2;
  398.                 contflag=0;
  399.                 break;
  400.             case 4 :            /* right key */
  401.                 endcode=3;
  402.                 contflag=0;
  403.                 break;
  404.             case 5 :            /* left key  */
  405.                 endcode=4;
  406.                 contflag=0;
  407.                 break;
  408.             case 6 :            /* CR key    */
  409.                 endcode=1;
  410.                 contflag=0;
  411.                 break;
  412.             case 7 :            /* 取消 key  */
  413.                 endcode=2;
  414.                 contflag=0;
  415.                 break;
  416.             default : break;
  417.         }
  418.  
  419.                     /* joy pad status check */
  420.         switch (pad_in()){
  421.             case 0 : break;        /* no input  */
  422.             case 1 :            /* A trigger */
  423.                 endcode=1;
  424.                 contflag=0;
  425.                 break;
  426.             case 2 :            /* B trigger */
  427.                 endcode=2;
  428.                 contflag=0;
  429.                 break;
  430.             case 3 :            /* down key  */
  431.                 endcode=1;
  432.                 contflag=0;
  433.                 break;
  434.             case 4 :            /* up key    */
  435.                 endcode=2;
  436.                 contflag=0;
  437.                 break;
  438.             case 5 :            /* right key */
  439.                 endcode=3;
  440.                 contflag=0;
  441.                 break;
  442.             case 6 :            /* left key   */
  443.                 endcode=4;
  444.                 contflag=0;
  445.                 break;
  446.             case 7 :            /* RUN key    */
  447.                 endcode=menuread( );
  448.                 contflag=0;
  449.                 break;
  450.             case 8 :            /* SELECT key */
  451.                 endcode=menuread( );
  452.                 contflag=0;
  453.                 break;
  454.             default : break;
  455.         }
  456.  
  457.         now=time(NULL);
  458.         strncpy(nowchar,ctime(&now),24);
  459.         for(i=16;i<21;i++) nowchar[i]=nowchar[i+3];
  460.         nowchar[21]=0x00;
  461.         if (oldmin!=nowchar[15]){
  462.             EGB_writePage(egbwork,1);
  463.             box(460,462,639,479,TITLEBACK_COL,1);
  464.             EGB_color(egbwork, 0, TIME_COL);
  465.             linedsp(460,478,nowchar);
  466.             EGB_writePage(egbwork,0);
  467.             EGB_color(egbwork, 0, TEXT_COL);
  468.             oldmin=nowchar[15];
  469.         }
  470.  
  471.     }
  472.     EGB_color(egbwork, 0, TEXT_COL);
  473.     EGB_color(egbwork, 1, BACK_COL);
  474.     return ( endcode );
  475. }
  476.  
  477.